package IOStream;

import java.io.*;

/*
    序列化(ObjectInputStream)：将对象转换为字节
    反序列化(ObjectOutputStream)：将字节转换为对象
    一个类想要实现序列化的功能必须实现Serializable接口(这个类的父类实现了Serializable接口也可以)
    如果这个类里面有自定义数据类型那么这个自定义数据类型的类也必须实现Serializable接口
    实现了Serializable接口之后尽量定义一个serialVersionUID的静态常量
    serialVersionUID：根据一个对象的所有属性类型与属性名计算得来，当序列化与反序列化的两个类serialVersionUID相等时才能正常操作
    例如：序列化完毕之后修改了某个属性名，则两个对象的类型虽然一样但是serialVersionUID值发生了变化
         定义了serialVersionUID的静态常量以后虽然可以正常操作，但是在反序列化时被修改的属性不能正常的赋值

    如果想要一个类里面的某个属性不被序列化和反序列化那么可以用static或者transient修饰
 */
public class SerializableDemo {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //将Person类序列化
        Person person1=new Person("yao",22,new Book("LOL"));
        ObjectOutputStream oos=new ObjectOutputStream(
                                new FileOutputStream(
                                new File("c:\\IOStream\\person.ser")));
        oos.writeObject(person1);   //将person序列化
        oos.close();
        //将Person对象反序列化
        ObjectInputStream ois=new ObjectInputStream(
                                new FileInputStream(
                                new File("c:\\IOStream\\person.ser")));
        Person person2=(Person)ois.readObject();
        ois.close();
        System.out.println(person1);
        System.out.println(person2);
        System.out.println(person1==person2);
    }
}

class Person implements Serializable{
    public static final long serialVersionUID=1L;
    String name;
    int age;
    Book book;
    public Person() {
    }

    public Person(String name, int age, Book book) {
        this.name = name;
        this.age = age;
        this.book = book;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", book=" + book +
                '}';
    }
}

class Book implements Serializable{
    String bName;

    public Book(String bName) {
        this.bName = bName;
    }

    @Override
    public String toString() {
        return "Book{" +
                "bName='" + bName + '\'' +
                '}';
    }
}
